/* 音频上下文 控制 */
/* innerAudioContext 对象的方法 */
/* 音频开启时，需要禁用手指触摸事件 */


var inner_timer_update;// 定时器（用于模拟音频进度更新事件）
export default {
	data() {
		return {
			createAudio:false,//后台音频
			moniAudio:false,//模拟音频（此属性用来如果是m3u8和mp4格式的，安卓和ios都不支持，但是可以模拟一个音频，就是视频播放，并没有创建音频）
			innerAudioContext:null,//音频上下文
			// 音频面板文字提示内容
			createAudioText:'在锁屏和切到后台时也能播放音频',//
		}
	},
	// 实例销毁之前调用
	beforeDestroy() {
		// 音频没开启时，不可以销毁实例，否则报错
		if (this.createAudio==false) return
		// 销毁当前实例
		this.AudioDestroy()
	},
	methods:{
		// 创建音频上下文并播放
		createAudioContext(){
			// 获取音频链接（如果音频链接未设置，则使用视频链接作为音频链接播放）
			var audioSrc = this.AudioSrc || this.src
			// 是否创建音频？如果遇到不支持，则设置false，不可以创建
			var setAudio
			// 判断音频链接是否支持当前设备
			if (audioSrc) {
				// 获取音频链接类型（后缀）
				var m3u8Reg = RegExp(/.m3u8/);//不支持
				var flacReg = RegExp(/.flac/);//ios不支持
				var m4aReg = RegExp(/.m4a/);//支持
				var oggReg = RegExp(/.ogg/);//ios不支持
				var apeReg = RegExp(/.ape/);//ios不支持
				var amrReg = RegExp(/.amr/);//ios不支持
				var wmaReg = RegExp(/.wma/);//ios不支持
				var wavReg = RegExp(/.wav/);//支持
				var mp3Reg = RegExp(/.mp3/);//支持
				var mp4Reg = RegExp(/.mp4/);//ios不支持
				var aacReg = RegExp(/.aac/);//支持
				var aiffReg = RegExp(/.aiff/);//安卓不支持
				var cafReg = RegExp(/.caf/);//安卓不支持
				if (this.platform_mobile == 'android'){
					//安卓不支持的
					if (audioSrc.match(m3u8Reg)||audioSrc.match(aiffReg)||audioSrc.match(cafReg)){
						setAudio = false
					}else {
						setAudio = true
					}
					//
				}else if (this.platform_mobile == 'ios'){
					//ios不支持的
					if (audioSrc.match(m3u8Reg)||audioSrc.match(flacReg)||audioSrc.match(oggReg)||audioSrc.match(apeReg)||audioSrc.match(amrReg)||audioSrc.match(wmaReg)||audioSrc.match(mp4Reg)){
						setAudio = false
					}else {
						setAudio = true
					}
				}
			}
			if (setAudio==true){
				// 暂停视频
				this.videoContext.pause()
				// 开启音频
				this.createAudio = true
				// 设置音频面板提示内容
				this.createAudioText = '在锁屏和切到后台时也能播放音频'
				// 创建音频上下文
				this.innerAudioContext = uni.createInnerAudioContext()
				// 设置音频自动播放
				this.innerAudioContext.autoplay = true
				// 设置音频链接
				this.innerAudioContext.src = audioSrc
				// 获取视频播放进度并去除小数后的数字，音频可能只支持整数
				let CurrTimeSeek = parseInt(this.timeUpdate[0].currentTime)
				// 设置音频播放事件
				this.innerAudioContext.onPlay(res => {
				    console.log('音频开始播放')
				    //console.log(res.duration)
					
					// 3.5.0版本新增
					// 设置音频跳转到指定位置，单位 s
					this.AudioSeek(CurrTimeSeek)
				})
				// 设置音频播放错误事件
				this.innerAudioContext.onError(res => {
					console.log(res.errMsg)
					console.log(res.errCode)
					// errCode 说明
					var errCode
					if (errCode==10001) {
						errCode = '系统错误'
					}else if (errCode==10002){
						errCode = '网络错误'
					}else if (errCode==10003){
						errCode = '文件错误'
					}else if (errCode==10004){
						errCode = '格式错误'
					}else if (errCode==Number(-1)){
						errCode = '未知错误'
					}
					uni.showModal({
						title:res.errMsg,
						content:errCode
					})
				})
				// 设置音频完成 seek 操作事件
				this.innerAudioContext.onSeeked(res => {
					console.log('音频完成 seek 操作事件')
					//console.log(res)
					
					// 模拟音频播放进度更新事件
					this.Simulation_Audio_timeupdate()
				})
				// 设置音频加载中事件，当音频因为数据不足，需要停下来加载时会触发
				this.innerAudioContext.onWaiting(res => {
					//
				})
				// 设置音频播放进度更新事件
				this.innerAudioContext.onTimeUpdate(res => {
					//console.log('音频播放进度更新')
					//console.log(res)
				})
			}else {
				// 如果是m3u8或mp4，则询问用户，是否使用模拟音频
				if (audioSrc.match(m3u8Reg)||audioSrc.match(mp4Reg)){
					// 支持模拟
					uni.showModal({
						title:'音频格式不支持',
						content:'但支持模拟音频，是否启用模拟音频',
						success: (res) => {
							if (res.confirm){
								// 用户确认
								// 开启音频（用于显示音频面板）
								this.createAudio = true
								// 开启模拟音频（用于关闭音频时判断）
								this.moniAudio = true
								// 设置音频面板提示内容
								this.createAudioText = '模拟音频不支持在锁屏和切到后台时播放音频'
							}else {
								// 用户取消
								uni.showToast({
									title:'用户取消',
									icon:'none'
								})
							}
						}
					})
				}else {
					// 完全不支持
					uni.showToast({
						mask:true,
						title:'音频格式不支持',
						icon:'none'
					})
				}
			}
		},
		// 播放音频
		AudioPlay(){
			this.innerAudioContext.play()
		},
		// 暂停音频
		AudioPause(){
			this.innerAudioContext.pause()
		},
		// 停止音频
		AudioStop(){
			this.innerAudioContext.stop()
		},
		// 跳转到指定位置，单位 s
		AudioSeek(e){
			this.innerAudioContext.seek(e)
		},
		// 销毁当前实例
		AudioDestroy(){
			this.innerAudioContext.destroy()
		},
		/* 
			3.5.0版本 新增事件
			由于uniapp音频播放进度更新事件返回一直是空的
			所以这里采用模拟进度更新事件。
		 */
		// 模拟音频播放进度更新事件
		Simulation_Audio_timeupdate(){
			/* 触发频率 250ms 一次
			 * event.detail = {currentTime, duration} 。
			 */
			
			// 判断 模拟音频=false 并且 创建音频=true 并且 模拟音频播放进度更新事件=true
			if (this.moniAudio == false && this.createAudio == true && this.Config.Simulation_Audio_timeupdate == true) {
				inner_timer_update = setTimeout(() => {
					// 当前时长
					let currentTime = Number(this.timeUpdate[0].currentTime + 0.2500)
					// 总时长 
					let duration = this.timeUpdate[0].duration
					// 入口参数
					let event = {detail: {currentTime,duration}}
					// 同步获取视频时长(视频进度)并更新到进度条上
					this.getTimeupdateSync(event)
					// 当前时长(当前进度)
					this.timeUpdate[0].currentTime = currentTime
					// 总时长(总进度)
					this.timeUpdate[0].duration = duration
					// 视频出错或断网后再链接了网络，使视频自动恢复续播
					this.timeUpdate[0].dwhfcurrTime = currentTime
					// 清除上一次的定时器
					clearTimeout(inner_timer_update)
					// 重复执行
					this.Simulation_Audio_timeupdate()
				},250)
			}
			
		}
		
	}
}